package cn.quevo.core.lang;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 扩展org.apache.commons.lang3.math.NumberUtils，提供java额外的数字操作
 * 
 * @author July july_sky@foxmail.com
 * @date 2017年6月30日 下午3:34:41
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 */
public class NumberUtils extends org.apache.commons.lang3.math.NumberUtils{

	/**
	 * 验证数字是否在区间范围内
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月10日下午10:20:07
	 * @param num
	 * @param min
	 * @param max
	 * @return
	 */
	public static boolean range(Number num,Number min,Number max){
		return num.doubleValue()>=min.doubleValue()&&num.doubleValue()<=max.doubleValue();
	}
	
	/**
	 * 格式化数字，保留2位小数
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月10日下午10:20:14
	 * @param number
	 * @return
	 */
	public static String format(Number number) {
		return new DecimalFormat("##0.00").format(number);
	}

	/**
	 * 转换为分
	 * 
	 * @param number
	 * @return
	 */
	public static String formatPenny(Number number) {
		return new DecimalFormat("0").format(number.doubleValue()*100);
	}
	
	/**
	 * 格式化数字
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月12日上午11:13:11
	 * @param number
	 * @param scale
	 * @return
	 */
	public static Double format(String number,Integer scale) {
		BigDecimal decimal = new BigDecimal(number);
		decimal.setScale(scale, RoundingMode.UP);
		return decimal.doubleValue();
	}
	
	/**
	 * 格式化数字
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2016年10月12日上午11:13:11
	 * @param number
	 * @param scale
	 * @return
	 */
	public static Double format(Double number,Integer scale) {
		BigDecimal decimal = new BigDecimal(number);
		decimal.setScale(scale, RoundingMode.UP);
		return decimal.doubleValue();
	}

	/**
	 * 四舍五入保保留N位小数
     *
	 * @author July july_sky@foxmail.com
	 * @date 2018-03-09 16:59:00
	 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
	 * @version 1.0
	 * @param val
	 * @param precision
	 * @return
	 */
	public static Double round(Double val, int precision) {
		if (val == null) {
			return 0D;
		}
		return new BigDecimal(val).setScale(precision, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 求和
     *
	 * @author July july_sky@foxmail.com
	 * @date 2018-03-09 17:02:50
	 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
	 * @version 1.0
	 * @param args
	 * @return
	 */
    public static Double sum(Object[] args) {
        if (StringUtils.isBlank(args) || StringUtils.isBlank(args[0])) {
            return 0d;
        }
        Double sum = 0d;
        for (Object obj : args) {
            if (!StringUtils.isBlank(obj)) {
                sum += NumberUtils.createDouble(obj.toString());
            }
        }
        return sum;
    }
}
